/*
 * ServerMessageListener.cpp
 *
 *  Created on: 14/06/2014
 *      Author: javier
 */

#include "ServerMessageListener.h"
#include "ProtocoloCliente.h"
#include "BZPController.h"
#include <string>

ServerMessageListener::ServerMessageListener(BZPController* controller,
		ClientSocket& socket) :
		socket(socket) {
	this->controller = controller;
	conected = false;
	idJugador = -1;
}

void ServerMessageListener::init(){
	try {
		socket.conectar();
		conected = true;
	} catch (ComunicacionException& e) {
		std::cout << "Sin conexion en listener" << std::endl;
	}
}

void ServerMessageListener::run() {
	while (isRunning()) {
		try {
			std::string r = ProtocoloCliente::recv_updates(
					socket.getSockfd());
			Message m;
			m.initFromString(r);
			Positionable *p;
			switch (m.code) {
			case UPDATE:
				controller->updatePosition(m.id,
						Utils::stringToDouble(m.args[0]),
						Utils::stringToDouble(m.args[1]));
//				std::cout << "Recibido update de posición del objeto " << m.id << std::endl;
				break;
			case NEW:
				p = new Positionable(m.id, Utils::stringToInt(m.args[0]),
						Utils::stringToInt(m.args[1]), (ModelObject)Utils::stringToInt(m.args[2]));
				controller->newObject(p);
				break;
			case DELETE:
				controller->removeObject(m.id);
				break;
			case END_MATCH:
			    std::cout << "Mensaje de fin de partida recibido" << std::endl;
				controller->clear();
				controller->showNextMatchView();
				break;
			case END_CAMPAIGN:
			    std::cout << "Mensaje de fin de campaña recibido" << std::endl;
				controller->clear();
				controller->showEndCampaignView();
				break;
			case SCORES:
				std::cout << "Recibido puntajes del servidor" << std::endl;
				controller->updateScores(m.args[0]);
				break;
			case NEW_PLAYER_ID:
				std::cout << "Nuevo bomberman con ID " << m.args[0] << std::endl;
				controller->setIDTarget(Utils::stringToInt(m.args[0]));
				break;
			case OK:
				std::cout << "Recibido OK del servidor" << std::endl;

				break;
			case ERROR:
				std::cout << "Recibido ERROR del servidor" << std::endl;

				break;
			default:
				std::cout << "Mensaje desconocido del servidor" << std::endl;

				break;
			}
		} catch (ComunicacionException &e) {
			std::cout << "Error en listener" << std::endl;
			conected = false;
			break;
		}
	}
}

ServerMessageListener::~ServerMessageListener() {
// TODO Auto-generated destructor stub
}

void ServerMessageListener::setIdJugador(int idJugador) {
	this->idJugador = idJugador;
}
